数据类型:REFERENCE TO
重要
对于编译器版本 >= V3.3.0.0,引用被初始化(在 0 处)。
重要
如果引用是指设备输入,则该访问被应用为写访问。生成代码时,这会导致编译器警告:"...invalid assignment target
”。
例子: rInput REF= Input;
如果您需要这种构造,则必须首先复制输入值(例如: rInput
) 到具有写访问权限的变量。
与参考 REFERENCE
数据类型隐式引用另一个对象。作业是用 REF=
操作员.访问时,引用被隐式取消引用,因此不需要特殊的内容运算符 ^
比如指针。
句法
<identifier> : REFERENCE TO <data type> ; <data type>: base type of the reference
PROGRAM PLC_PRG VAR rspeA : REFERENCE TO DUT_SPECIAL; pspeA : POINTER TO DUT_SPECIAL; speB : DUT_SPECIAL; END_VAR rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB); rspeA := speD; // The code corresponds to pspeA^ := speD;
ariTest : ARRAY[0..9] OF REFERENCE TO INT; priTest : POINTER TO REFERENCE TO INT; rriTest : REFERENCE TO REFERENCE TO INT; rbitTest : REFERENCE TO BIT;
引用类型不得用作数组、指针或引用的基类型。此外,引用不得引用位变量。这些类型的结构会产生编译器错误。
注意
当通过标识符及其别名同时访问同一存储单元时,程序的可读性会变得困难。
例子: speB
和 rspeA
提示
指向的引用和指针 BIT
变量是 无效 声明,以及具有基本类型的数组元素 BIT
。
当引用被分配时 :=
,无论引用是在左侧、右侧还是两侧,始终都会复制值:
Ref := value
写入值value
到参考点指向的位置。用指针表示法:Ref^ := value
value := Ref
之后写入引用指向的值value
。用指针表示法:value := Ref^
Ref1 := Ref2
写入的值Ref2
指着。在那个位置Ref1
指着。用指针表示法:Ref1^ := Ref2^
什么时候 REF=
使用时,始终应用地址,并且左侧必须有一个引用:
Ref REF= value
: 参考点value
。用指针表示法:Ref :=ADR(value)
Ref1 REF= Ref2
:Ref1
指向相同的值Ref2
。用指针表示法:Ref1 := Ref2
Value REF = Ref
导致编译错误
提示
在声明中, REFERENCE TO INT REF= value
表现得像 REFERENCE TO INT := value
。
引用和指针的比较
更容易使用:
引用可以直接访问被引用对象的内容,而无需取消引用。
传递值时更精细和更简单的语法:
调用一个功能块,它传递一个没有地址运算符而不是指针的引用
例子:
fbDoIt(riInput:=iValue);
代替:
fbDoIt_1(piInput:=ADR(iValue));
类型安全:
分配两个引用时,编译器会检查它们的基类型是否匹配。这在指针的情况下不被检查。
测试参考的有效性
您可以使用运算符 __ISVALIDREF
检查引用是否指向有效值(即不等于 0 的值)。
句法
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>
: 声明的标识符 REFERENCE TO
布尔变量是 TRUE
当引用指向一个有效值时。否则就是 FALSE
.
PROGRAM PLC_PRG VAR iAlfa : INT; riBravo : REFERENCE TO INT; riCharlie : REFERENCE TO INT; bIsRef_Bravo : BOOL := FALSE; bIsRef_Charlie : BOOL := FALSE; END_VAR iAlfa := iAlfa + 1; riBravo REF= iAlfa; riCharlie REF= 0; bIsRef_Bravo := __ISVALIDREF(riBravo); (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *) bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)
提示
在编译器版本 3.5.7.40 及更高版本中,隐式监控功能 检查指针 作用于类型变量 REFERENCE TO
与指针变量相同。